package Graficas;

import java.awt.Graphics;
import java.util.LinkedList;

import Logica.Celdas.Celda;

/**
 * Clase que realiza una animacion UpDown, esto es que una imagen se mueva hacia arriba una
 * determinada cantidad de movimiento y luego se mueva hacia abajo hasta llegar a la posicion
 * inicial que tenia antes de realizar la animacion. La animacion se realiza en un hilo
 * independiente y luego termina su ejecucion al finalizar la animacion.
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public class UpDownAnimation extends Thread implements Pintable_Animable {
	/* ################## ATRIBUTOS DE INSTANCIA ######################## */
	private Celda c;
	private int y, yActual, maxy;
	private boolean subiendo;

	/* ################## CONSTRUCTORES ######################## */
	/**
	 * Constructor para una animacion.
	 * 
	 * @param c
	 *            - Celda sobre la cual se quiere aplicar la animacion.
	 * 
	 */
	public UpDownAnimation(Celda c) {
		super("UpDownAnimation");
		this.c = c;
		y = c.getY();
		yActual = y;
		maxy = yActual - c.getSizeY() / 3;
		subiendo = true;
		// le indico a la celda que va a ser animada por esta entidad.
		c.setInAnimation(true);
	}

	/* ################## COMANDOS ######################## */
	/**
	 * Inicio la ejecucion de la animacion.
	 */
	public void run() {
		yActual--;
		while (y != yActual) {
			if (yActual > maxy && subiendo) {
				yActual--;
			} else if (yActual < y) {
				subiendo = false;
				yActual++;
			}
			try {
				sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// una vez finalizada la animacion reestablezco la celda, indicandole que termine de
		// realizar su animacion.
		c.restablecer();
	}

	@Override
	public void pintar(Graphics g, Sprite sprite, int x, int y) {
		sprite.Draw(g, x, yActual);
	}

	/* ################## CONSULTAS ######################## */
	@Override
	public boolean isAliveAnimation() {
		return this.isAlive();
	}

	@Override
	public Celda getCelda() {
		return c;
	}
}
